package cn.seecoder.ai.enums;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;

/**
 * @author fanyanpeng
 * @date 2023/4/6 2:42
 */
@Getter
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum MachineLearningAlgorithmEnum {

    DECISION_TREE_CLASSIFICATION(
            "DECISION_TREE_CLASSIFICATION",
            "决策树分类",
            "决策树（Decision Tree）是在已知各种情况发生概率的基础上，通过构成决策树来求取净现值的期望值大于等于零的概率，评价项目风险，判断其可行性的决策分析方法，是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干，故称决策树。在机器学习中，决策树是一个预测模型，他代表的是对象属性与对象值之间的一种映射关系。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.SEED,
                    TrainParamEnum.MAX_DEPTH,
                    TrainParamEnum.MAX_BINS,
                    TrainParamEnum.MIN_INFO_GAIN
            }
    ),
    GRADIENT_BOOSTED_TREE_CLASSIFICATION(   //目前只支持2分类：https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.ml.classification.GBTClassifier.html
            "GRADIENT_BOOSTED_TREE_CLASSIFICATION",
            "梯度提升树分类",
            "梯度提升决策树（Gradient Boosting Decision Tree，GBDT）是以决策树为基学习器的一种Boosting算法，它在每一轮迭代中建立一个决策树，使当前模型的残差在梯度方向上减少；然后将该决策树与当前模型进行线性组合得到新模型；不断重复，直到决策树数目达到指定的值，得到最终的强学习器。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.SEED,
                    TrainParamEnum.MAX_DEPTH,
                    TrainParamEnum.MAX_BINS,
                    TrainParamEnum.MIN_INSTANCES_PER_NODE,
                    TrainParamEnum.MIN_INFO_GAIN,
                    TrainParamEnum.MAX_ITER
            }
    ),


    LOGISTIC_REGRESSION_CLASSIFICATION(
            "LOGISTIC_REGRESSION_CLASSIFICATION",
            "对数几率回归分类",
            "对数几率回归（Logistic Regression），也称逻辑回归，虽然名字中含有回归，但其实是一种分类算法。找一个单调可微函数将分类任务中的真实标记与线性回归模型的预测值联系起来，是一种广义线性回归。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.MAX_ITER,
                    TrainParamEnum.REG_PARAM,
                    TrainParamEnum.ELASTIC_NET_PARAM
            }
    ),

    MULTILAYER_PERCEPTRON_CLASSIFICATION(
            "MULTILAYER_PERCEPTRON_CLASSIFICATION",
            "多层感知器分类",
            "多层感知器（MLP，Multilayer Perceptron）是一种前馈人工神经网络模型，其将输入的多个数据集映射到单一的输出的数据集上。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.SEED,
                    TrainParamEnum.BLOCK_SIZE,
                    TrainParamEnum.MAX_ITER,
            }
    ),

    NAIVE_BAYES_CLASSIFICATION(
            "NAIVE_BAYES_CLASSIFICATION",
            "朴素贝叶斯分类",
            "贝叶斯分类算法是统计学的一种分类方法，它是一类利用概率统计知识进行分类的算法。在许多场合，朴素贝叶斯(Naïve Bayes，NB)分类算法可以与决策树和神经网络分类算法相媲美，该算法能运用到大型数据库中，而且方法简单、分类准确率高、速度快。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,

            }
    ),
    XGBOOST_CLASSIFICATION(
            "XGBOOST_CLASSIFICATION",
            "XGBOOST分类",
            "XGBOOST是一种集成学习方法，迭代中进行优化。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.MAX_BINS,
            }
    )
    ,


    RANDOM_FOREST_CLASSIFICATION(
            "RANDOM_FOREST_CLASSIFICATION",
            "随机森林分类",
            "在分类问题中，随机森林是一种集成学习算法，通过构建多个决策树来完成分类任务。每个决策树都是通过随机抽样得到的一部分训练数据进行构建的，因此每个决策树都会有自己的偏差和方差。通过集成多个决策树，可以减少整体模型的方差，从而提高模型的准确性和泛化能力。在预测新数据时，随机森林会将每个决策树的结果进行投票，最终选择得票最多的结果作为模型的输出。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.SEED,
                    TrainParamEnum.MAX_DEPTH,
                    TrainParamEnum.MAX_BINS,
                    TrainParamEnum.MIN_INSTANCES_PER_NODE,
                    TrainParamEnum.MIN_INFO_GAIN,
                    TrainParamEnum.NUM_TREES
            }
    ),

    K_MEANS_CLUSTERING(
            "K_MEANS_CLUSTERING",
            "K均值聚类",
            "k均值聚类算法（k-means clustering algorithm）是一种迭代求解的聚类分析算法，其步骤是，预将数据分为K组，则随机选取K个对象作为初始的聚类中心，然后计算每个对象与各个种子聚类中心之间的距离，把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本，聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有（或最小数目）对象被重新分配给不同的聚类，没有（或最小数目）聚类中心再发生变化，误差平方和局部最小。",
            new TrainParamEnum[]{
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.SEED,
                    TrainParamEnum.K,
                    TrainParamEnum.MAX_ITER,
            }
    ),

    DECISION_TREE_REGRESSION("DECISION_TREE_REGRESSION",
            "决策树回归算法",
            "决策树回归算法是一种基于树形结构的监督学习算法，用于预测连续型变量的输出。该算法通过根据给定的训练数据构建一棵决策树来进行预测。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.SEED,
                    TrainParamEnum.MAX_DEPTH,
                    TrainParamEnum.MAX_BINS,
                    TrainParamEnum.MIN_INFO_GAIN,
            }),


    RANDOM_FOREST_REGRESSION(
            "RANDOM_FOREST_REGRESSION",
            "随机森林回归",
            "在回归问题中，随机森林同样可以通过构建多个决策树来完成回归任务。每个决策树都会通过随机抽样得到的一部分训练数据进行构建，每个节点的分裂准则也不同。在预测新数据时，随机森林会将每个决策树的预测结果取平均值作为最终的预测结果。",
            new TrainParamEnum[]{
                    TrainParamEnum.TRAIN_DATA_SET_OCCUPY,
                    TrainParamEnum.MAX_CATEGORIES,
                    TrainParamEnum.SEED,
                    TrainParamEnum.MAX_DEPTH,
                    TrainParamEnum.MAX_BINS,
                    TrainParamEnum.MIN_INSTANCES_PER_NODE,
                    TrainParamEnum.MIN_INFO_GAIN,
                    TrainParamEnum.NUM_TREES
            }
    ),

    ;





    private final String self;
    private final String algorithmName;
    //    private final String learningType;
    private final String description;
    private final TrainParamEnum[] trainParamEnums;




    MachineLearningAlgorithmEnum(String self, String algorithmName, String description, TrainParamEnum[] trainParamEnums) {
        this.self = self;
        this.algorithmName = algorithmName;

        this.description = description;
        this.trainParamEnums = trainParamEnums;
    }
}
